home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok11
/
r.o.m.
/
m2sources
/
stringinput.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
12KB
|
387 lines
IMPLEMENTATION MODULE StringInput;
(*Created: 29.8.87
Changed: 22.1.88/20.02.88/27.7.88/11.9.88 by
Stefan Salewski
Stolper Weg 3
2160 Stade West-Germany
Tel: 04141/61130
Note: compiled with AMIGA Modula-2 System by AMSoft, Version from 5.5.88
This Module may be freely copied. But please
leave my name in. Thanks....Stefan
*)
FROM SYSTEM IMPORT ADR,BYTE;
FROM DeactivateGadget IMPORT PressRButton;
FROM Intuition IMPORT IDCMPFlags,IDCMPFlagSet,GadgetPtr,ModifyIDCMP,
IntuiMessagePtr,WindowFlags,WindowFlagSet,NewWindow,ActivateGadget,
Window,WindowPtr,ScreenFlags,ScreenFlagSet,IntuiText,
StringInfo,Border,Gadget,GadgetFlags,GadgetFlagSet,ActivationFlags,
ActivationFlagSet,Image,strGadget,boolGadget,OpenWindow,CloseWindow;
FROM Exec IMPORT ReplyMsg,GetMsg,MessagePtr,AllocMem,CopyMem,MemReqs,
MemReqSet,WaitPort,FreeMem,UByte;
FROM Dos IMPORT Delay;
FROM Graphics IMPORT jam2, jam1,DrawModeSet;
FROM MyStrings IMPORT Length;
FROM MyUties IMPORT Min;
FROM Preference IMPORT CharSize;
FROM SYSTEM IMPORT LONGSET,ADDRESS,INLINE;
FROM Arts IMPORT Assert,TermProcedure;
CONST
OK1Size=300; (* I don't Know how I can find the exact Size ????? *)
Cancel1Size=300; (* I don't Know how I can find the exact Size ????? *)
VAR charWidth,charHeight:INTEGER;
windowPtr:WindowPtr;
ok1Adr,cancel1Adr:ADDRESS;
PROCEDURE OK1; (*$E- Bild fuer OKGadget *)
BEGIN
INLINE(
01FFFH,0FFFFH,0FFE0H,03FFFH,0FFFFH,0FFF8H,
07000H,00000H,0001CH,0E000H,00000H,0000EH,
0E000H,00000H,0000EH,0E003H,0F07CH,0380EH,
0E00EH,01C38H,0600EH,0E01CH,00E38H,0C00EH,
0E038H,00739H,0800EH,0E038H,0073BH,0000EH,
0E038H,0073EH,0000EH,0E038H,0073FH,0000EH,
0E038H,0073BH,0800EH,0E01CH,00E39H,0C00EH,
0E00EH,01C38H,0E00EH,0E003H,0F07CH,0F80EH,
0E000H,00000H,0000EH,0E000H,00000H,0000EH,
07000H,00000H,0001CH,03FFFH,0FFFFH,0FFF8H,
00FFFH,0FFFFH,0FFF0H,0FFFFH,0FFFFH,0FF00H,
0776FH,0726BH,0696EH,0672EH,02E2EH,06E6CH,
0792EH,00A0AH,02062H,06520H,06672H,06565H,
06C79H,02064H,06973H,07472H,06962H,07574H,
06564H,02066H,06F72H,0206EH,06F6EH,02D70H,
0726FH,06669H,0740AH,04EACH,089C2H,04E5DH,
04E75H,04E55H,00000H,0302CH,0AD32H,048C0H,
02F00H,0486CH,08DF4H,04EACH,083B6H,0504FH,
042A7H,04878H,000FFH,04878H,000CCH,0302CH,
08EF2H,048C0H,0322CH,08EFAH,048C1H,0B081H,
06C08H,0302CH,08EF2H,048C0H,06006H,0302CH
)
END OK1;
PROCEDURE Cancel1; (*$E- Bild fuer CancelGadget *)
BEGIN
INLINE
(
01FFFH,0FFFFH,0FFFFH,0FFFFH,0FFFFH,0FF00H,
03FFFH,0FFFFH,0FFFFH,0FFFFH,0FFFFH,0FF80H,
07000H,00000H,00000H,00000H,00000H,001C0H,
0E000H,00000H,00000H,00000H,00000H,000E0H,
0E000H,00000H,00000H,00000H,00000H,000E0H,
0E003H,0FD00H,00000H,00000H,0000FH,000E0H,
0E00EH,00700H,00000H,00000H,00007H,000E0H,
0E01CH,00300H,00000H,00000H,00007H,000E0H,
0E038H,00000H,00000H,00000H,00007H,000E0H,
0E038H,0001FH,0C77CH,003F8H,03E07H,000E0H,
0E038H,00060H,0E3C7H,00E1CH,0E387H,000E0H,
0E038H,00000H,0E383H,09C01H,0C1C7H,000E0H,
0E038H,0001FH,0E383H,09C01H,0FFC7H,000E0H,
0E01CH,00330H,0E383H,09C01H,0C007H,000E0H,
0E00EH,00670H,0E383H,08E0CH,0E1C7H,000E0H,
0E003H,0FC3FH,0F7C7H,0C3F8H,03F0FH,080E0H,
0E000H,00000H,00000H,00000H,00000H,000E0H,
0E000H,00000H,00000H,00000H,00000H,000E0H,
07000H,00000H,00000H,00000H,00000H,001C0H,
03FFFH,0FFFFH,0FFFFH,0FFFFH,0FFFFH,0FF80H,
01FFFH,0FFFFH,0FFFFH,0FFFFH,0FFFFH,0FF00H
)
END Cancel1;
PROCEDURE Cleanup;
BEGIN
IF windowPtr#NIL THEN
CloseWindow(windowPtr);
windowPtr:=NIL
END;
IF ok1Adr#NIL THEN
FreeMem(ok1Adr,OK1Size);
ok1Adr:=NIL
END;
IF cancel1Adr#NIL THEN
FreeMem(cancel1Adr,OK1Size);
cancel1Adr:=NIL
END;
END Cleanup;
PROCEDURE AskForStrings(VAR windowTitle:ARRAY OF CHAR;
anzStrings:Anzahl;
VAR daten:ARRAY OF Datum):BOOLEAN;
CONST
CursorUpP=103;
CursorDownP=101;
OkWidth=47;OkHeight=21;
CancelWidth=91;CancelHeight=21;
LBorder=2;
RBorder=2;
TBorder=12;
Delta=2;
TYPE
Index=INTEGER[-1..MaxAnzGadgets-1];(*-1 to be an Integer*)
VAR
hRegister[0BFEC01H]:UByte; (* Tastatur-HardwareRegister *)
lastKey:UByte;
i,high,gaNummer:Index;
ende:BOOLEAN;
msgadr:GadgetPtr;
myGadgets:ARRAY Index OF Gadget;
okGadget:Gadget;
cancelGadget:Gadget;
newWindow:NewWindow;
msgPtr:IntuiMessagePtr;
class:IDCMPFlagSet;
myGadgetBorder:ARRAY Index OF Border;
myStringInfos:ARRAY Index OF StringInfo;
myIntuitionTexts:ARRAY Index OF IntuiText;
myUndoBuffer:Buffer;
myBorKoPairs:ARRAY Index OF ARRAY[0..4] OF RECORD
x:INTEGER;
y:INTEGER;
END;
maxTL,maxSZ:INTEGER;
myOKImage,myCancelImage:Image;
PROCEDURE InitGadgets;
PROCEDURE LaengsterString():CARDINAL;
VAR
i:Index;
l,max:CARDINAL;
BEGIN
max:=0;
FOR i:=0 TO anzStrings-1 DO
l:=Length(daten[i].text);
IF l>max THEN
max:=l
END;
END;
RETURN max;
END LaengsterString;
PROCEDURE MaxSichtbareZeichen():CARDINAL;
VAR
i:Index;
max:CARDINAL;
BEGIN
max:=0;
FOR i:=0 TO anzStrings-1 DO
IF daten[i].sichtbareZeichen >max THEN
max:=daten[i].sichtbareZeichen
END;
END;
RETURN max;
END MaxSichtbareZeichen;
BEGIN (* InitGadgets *)
maxTL:=INTEGER(LaengsterString());
maxSZ:=INTEGER(MaxSichtbareZeichen());
high:=Min(MaxAnzGadgets-1,anzStrings-1);
FOR i:=0 TO high DO
myBorKoPairs[i,0].x:=0;
myBorKoPairs[i,0].y:=0;
myBorKoPairs[i,1].x:=charWidth*INTEGER(daten[i].sichtbareZeichen)+Delta;
myBorKoPairs[i,1].y:=0;
myBorKoPairs[i,2].x:=charWidth*INTEGER(daten[i].sichtbareZeichen)+Delta;
myBorKoPairs[i,2].y:=charHeight+Delta;
myBorKoPairs[i,3].x:=0;
myBorKoPairs[i,3].y:=charHeight+Delta;
myBorKoPairs[i,4].x:=0;
myBorKoPairs[i,4].y:=0;
WITH myGadgetBorder[i] DO
leftEdge:=-Delta;
topEdge:=-Delta;
frontPen:=1;
backPen:=0;
drawMode:=jam1;
count:=5;
xy:=ADR(myBorKoPairs[i,0].x);
nextBorder:=NIL;
END;
WITH myStringInfos[i] DO
buffer:=ADR(daten[i].buffer);
undoBuffer:=ADR(myUndoBuffer);
bufferPos:=0;
maxChars:=BufferLength;
dispPos:=0;
END;
WITH myIntuitionTexts[i] DO
frontPen:=3;
backPen:=0;
drawMode:=jam1;
leftEdge:= -charWidth*maxTL-2*Delta;
topEdge:=Delta DIV 2;
iTextFont:=NIL;
iText:=ADR(daten[i].text);
nextText:=NIL;
END;
WITH myGadgets[i] DO
IF i<high THEN
nextGadget:=ADR(myGadgets[i+1])
ELSE
nextGadget:=ADR(okGadget);
END;
leftEdge:=charWidth*maxTL+LBorder+3*Delta;
topEdge:=i*(charHeight+3*Delta)+TBorder+Delta;
width:=INTEGER(daten[i].sichtbareZeichen) *charWidth;
height:=charHeight+Delta;
flags:=GadgetFlagSet{};
activation:=ActivationFlagSet{gadgImmediate,relVerify};
gadgetType:=strGadget;
gadgetRender:=ADR(myGadgetBorder[i]);
selectRender:=ADR(myGadgetBorder[i]);
gadgetText:=ADR(myIntuitionTexts[i]);
mutualExclude:=LONGSET{};
specialInfo:=ADR(myStringInfos[i]);
gadgetID:=i;
userData:=NIL;
END;
END;
WITH myOKImage DO
leftEdge:=0;
topEdge:=0;
width:=OkWidth;
height:=OkHeight;
depth:=1;
IF (ADR(OK1)+OK1Size) >= 80000H THEN
ok1Adr:=AllocMem(OK1Size,MemReqSet{chip});
CopyMem(ADR(OK1),ok1Adr,OK1Size);
imageData:=ok1Adr
ELSE
ok1Adr:=NIL;
imageData:=ADR(OK1)
END;
planePick:=1;
planeOnOff:=2;
nextImage:=NIL;
END;
WITH myCancelImage DO
leftEdge:=0;
topEdge:=0;
width:=CancelWidth;
height:=CancelHeight;
depth:=1;
IF (ADR(Cancel1)+Cancel1Size) >= 80000H THEN
cancel1Adr:=AllocMem(OK1Size,MemReqSet{chip});
CopyMem(ADR(Cancel1),cancel1Adr,Cancel1Size);
imageData:=cancel1Adr
ELSE
cancel1Adr:=NIL;
imageData:=ADR(Cancel1)
END;
planePick:=1;
planeOnOff:=2;
nextImage:=NIL;
END;
WITH okGadget DO
nextGadget:=ADR(cancelGadget);
IF (maxSZ-1)*charWidth > (OkWidth+CancelWidth) THEN
leftEdge:=charWidth*maxTL+LBorder+2*Delta
ELSE
leftEdge:=Delta+LBorder;
END;
topEdge:=(high+1)*(charHeight+3*Delta)+TBorder+Delta;
width:=OkWidth;
height:=OkHeight;
flags:=GadgetFlagSet{gadgImage};
activation:=ActivationFlagSet{gadgImmediate};
gadgetType:=boolGadget;
gadgetRender:=ADR(myOKImage);
selectRender:=NIL;
gadgetText:=NIL;
mutualExclude:=LONGSET{};
specialInfo:=NIL;
gadgetID:=high+1;
userData:=NIL;
END;
WITH cancelGadget DO
nextGadget:=NIL;
leftEdge:=(maxSZ+maxTL)*charWidth+LBorder+3*Delta-CancelWidth;
topEdge:=(high+1)*(charHeight+3*Delta)+TBorder+Delta;
width:=CancelWidth;
height:=CancelHeight;
flags:=GadgetFlagSet{gadgImage};
activation:=ActivationFlagSet{gadgImmediate};
gadgetType:=boolGadget;
gadgetRender:=ADR(myCancelImage);
selectRender:=NIL;
gadgetText:=NIL;
mutualExclude:=LONGSET{};
specialInfo:=NIL;
gadgetID:=high+2;
userData:=NIL;
END;
END InitGadgets;
BEGIN (*AskForStrings*)
InitGadgets;
WITH newWindow DO
leftEdge:=0;
topEdge:=0;
width:=(maxSZ+maxTL)*charWidth+RBorder+5*Delta;
Assert(width<640,ADR('StringInput1:W zu breit'));
height:=(high+1)*(charHeight+3*Delta)+TBorder+2*Delta+OkHeight;
Assert(height<256,ADR('StringInput1:W zu hoch'));
detailPen:=0;
blockPen:=1;
idcmpFlags:=IDCMPFlagSet{gadgetDown,gadgetUp,intuiTicks};
flags:=WindowFlagSet{activate,windowDrag,windowDepth,
noCareRefresh,simpleRefresh};
type:=ScreenFlagSet{wbenchScreen};
firstGadget:=ADR(myGadgets[0]);
checkMark:=NIL;
title:=ADR(windowTitle);
screen:=NIL;
bitMap:=NIL;
minWidth:=30;
minHeight:=30;
maxWidth:=640;
maxHeight:=255;
END;
windowPtr:=OpenWindow(newWindow);
Assert(windowPtr#NIL,ADR('StringInput: Cannot open Window'));
(*Delay(10);*)
gaNummer:=0;
IF ActivateGadget(ADR(myGadgets[gaNummer]),windowPtr,NIL) THEN END;
ende:=FALSE;
REPEAT
WaitPort(windowPtr^.userPort);
lastKey:=hRegister;
(*ModifyIDCMP(windowPtr,IDCMPFlagSet{gadgetDown,gadgetUp});*)
(* damit nicht zu viele intuiTicks eintreffen *)
msgPtr:=GetMsg(windowPtr^.userPort);
IF msgPtr# NIL THEN
class:= msgPtr^.class;
msgadr:=msgPtr^.iAddress;
ReplyMsg(msgPtr);
IF class=IDCMPFlagSet{gadgetDown} THEN
gaNummer:=msgadr^.gadgetID
ELSIF
(class=IDCMPFlagSet{gadgetUp}) OR (lastKey=CursorDownP) THEN
IF gaNummer< high THEN
INC(gaNummer);
IF (lastKey=CursorDownP) AND PressRButton() THEN END;
IF ActivateGadget(ADR(myGadgets[gaNummer]),windowPtr,NIL) THEN END;
Delay(5);
ELSE
ende:=(lastKey#CursorDownP)
END;
END;
IF lastKey=CursorUpP THEN
IF gaNummer> 0 THEN
DEC(gaNummer);
IF PressRButton() THEN END;
IF ActivateGadget(ADR(myGadgets[gaNummer]),windowPtr,NIL) THEN END;
Delay(5);
END;
END;
END;
(*ModifyIDCMP(windowPtr,IDCMPFlagSet{gadgetDown,gadgetUp,intuiTicks});*)
UNTIL ende OR (msgadr^.gadgetID>high);
Cleanup;
RETURN (ende OR (msgadr^.gadgetID = INTEGER(anzStrings)));
END AskForStrings;
BEGIN
TermProcedure(Cleanup);
CharSize(charWidth,charHeight);
END StringInput.mod